package compraventa.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import compraventa.excepcion.DAOExcepcion;
import compraventa.modelo.Publicacion;
import compraventa.util.ConexionMyBD;

public class PublicacionDAO extends BaseDAO {
	
	public Publicacion insertar(Publicacion vo) throws DAOExcepcion {
		String query = "insert into publicacion(cantidad,contador,descripcion,estadoArt," +
				"fechaPub,fechafinPub,precio,titulo,catpubli_idcategoria,persona_idpersona) " +
				"values (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionMyBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getCantidad());
			stmt.setInt(2, vo.getContador());
			stmt.setString(3, vo.getDescripcion());
			stmt.setString(4, vo.getEstado());
			stmt.setString(5, vo.getFecha());
			stmt.setString(6, vo.getFechaFin());
			stmt.setDouble(7, vo.getPrecio());
			stmt.setString(8, vo.getTitulo());
			stmt.setInt(9, vo.getIdCategoria());
			stmt.setInt(10, vo.getIdPersona());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdPublicacion(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Publicacion obtener(int idPublicacion) throws DAOExcepcion {
		Publicacion vo = new Publicacion();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT idPublicacion, descripcion, cantidad, precio, titulo, " +
					"fechaPub, fechaFinPub, contador, catPubli_idcategoria, persona_idpersona" +
					" FROM publicacion where idPublicacion=?";
			con = ConexionMyBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPublicacion);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdPublicacion(rs.getInt(1));
				vo.setDescripcion(rs.getString(2));
				vo.setCantidad(rs.getInt(3));
				vo.setPrecio(rs.getDouble(4));
				vo.setTitulo(rs.getString(5));
				vo.setFecha(rs.getString(6));
				vo.setFechaFin(rs.getString(7));
				vo.setContador(rs.getInt(8));
				vo.setIdCategoria(rs.getInt(9));
				vo.setIdPersona(rs.getInt(10));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void actualizar(Publicacion vo) throws DAOExcepcion {
		String query = "update publicacion set cantidad=?,contador=?,descripcion=?,estadoArt=?," +
				"fechaPub=?,fechafinPub=?,precio=?,titulo=?,catpubli_idcategoria=? " +
				"where idpublicacion=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionMyBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getCantidad());
			stmt.setInt(2, vo.getContador());
			stmt.setString(3, vo.getDescripcion());
			stmt.setString(4, vo.getEstado());
			stmt.setString(5, vo.getFecha());
			stmt.setString(6, vo.getFechaFin());
			stmt.setDouble(7, vo.getPrecio());
			stmt.setString(8, vo.getTitulo());
			stmt.setInt(9, vo.getIdCategoria());
			stmt.setInt(10, vo.getIdPublicacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	

	public Collection<Publicacion> listarPorContador() throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionMyBD.obtenerConexion();

			String query = "select u.nombre, u.paterno, u.materno, p.titulo, p.descripcion, p.cantidad, p.precio "+
			"from publicacion as p " +
			"left join persona as u on u.idpersona = p.persona_idpersona "+
			"order by p.contador desc";
			
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Publicacion vo = new Publicacion();
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	
}
